import java.io.*;
import java.net.*;
import java.util.*;

public class ServidorEco
{
	public static void main(String[] args)
	{
		ServerSocket ss = null;
		Socket s = null;

		try
		{
			ss = new ServerSocket(9999);
		}
		catch (IOException e)
		{
			e.printStackTrace();
			System.exit(-1);
		}

		System.out.println("Escuchando en el puerto 9999: " + ss);

		EnviarMensaje em = new EnviarMensaje();
		while (true)
		{
			try
			{
				s = ss.accept();
				System.out.println("Nueva conexion aceptada: " + s);
				em.addSocket (s);
				new GestorPeticion(s, em).start();
				s = null;
			}
			catch (Exception e)
			{
				e.printStackTrace();
				System.exit(-1);
			}
		}
	}
}

class EnviarMensaje
{
	static List<Socket> lista_de_sockets;

	public EnviarMensaje()
	{
		lista_de_sockets = new ArrayList<Socket>();
	}

	void addSocket(Socket s)
	{
		lista_de_sockets.add (s);
	}

	void enviarATodos(String mensaje, Socket s1)
	{
		Iterator iterador = lista_de_sockets.iterator();
		while (iterador.hasNext())
		{
			Socket s = (Socket) iterador.next();
			if (!s1.equals (s))
			{
				try
				{
					PrintWriter salida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
					salida.println(mensaje);
				}
				catch (Exception e)
				{
					e.printStackTrace();
					System.exit(-1);
				}
			}
		}
	}
}

class GestorPeticion extends Thread
{
	BufferedReader entrada = null;
	PrintWriter salida = null;
	Socket s;
	EnviarMensaje em;
	String nick;

	public GestorPeticion(Socket s, EnviarMensaje em)
	{
		this.s = s;
		this.em = em;
		nick = "";
	}

	public void run()
	{
		try
		{
			entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
			salida  = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
			salida.println("Bienvenido a la sala de chat de Ronald");
			salida.println("Ingresa tu nick: ");
			nick = entrada.readLine();

			while (true)
			{
				String str = entrada.readLine();
				if (str.equals("bye"))
					break;
				System.out.println("Recibio: " + str);
				str = nick + "> " + str;
				em.enviarATodos (str, s);
			}

			salida.close();
			entrada.close();
		}
		catch (Exception e)
		{
			e.printStackTrace();
//			System.exit(-1);
		}
	}
}